/**
 * 1.match某种程度上可以看作rust中if-else的升级版，只不过match有时候可以让我们少打印一些代码而已
 * match不像java的switch那么傻瓜(传统)，需要在每个分支上break，否则会继续执行下一个分支,虽然有那种情况存在，但是绝大部分时候，
 * 我们并不需要break。
 * 
 * rust的match和新版本的java switch写法更加一致，已经不需要break了，且不会傻乎乎地每个匹配过去
 * 
 * 2.顺便说一下，rust的创始人很喜欢下划线。所以下划分可以分割变量，也可以单独作为一个变量，但是不建议这么做
 * 3.关于分支值的匹配
 *   a.rust的分支匹配是穷尽的，意思就是编译器如果发现你存在一些未匹配的分支，就会报错。  我们记住这个就可以了，因为编译器很贴心第处理了这个。
 *     这一点，的确比许多编译器好多了。
 *   b.rust可以使用多种方式匹配某个分支值，包括单个值、多个值、所有值
 *   c.rust使用下划线_来表示所有值，这样我们就可以直接使用这个变量了。这个倒是比许多语言的default稍微省事一些。这个并不是重点
 *   d._和other都可以表示所有值，能一起用，不会编译错误，但是固定有一个分支不可达到。
 *     这意味着，rust的编译器目前虽然很贴心，但也不会浪费过多的时间去判断是否具有相同的分支--因为它允许有相同的分支，但是
 *     它的匹配机制使得只会有其中一个分支被执行，其它相同的并会被处理
 *   e.当某个分支值满足之后，匹配代码就结束了，不会像传统的java switch那么傻叉继续执行后面的。这个符合大部分人的思维
 * 
 * 
 */
/**
 * 年代枚举
 */
#[derive(Debug)] 
enum Age{Year1970,OtherYear}

/**
 * 硬币枚举
 */
enum Coin{一分(Age),二分,五分,一角,贰角,五角,一元}
/**
 * 文明枚举
 */
#[derive(Debug)] 
enum Civil{中国(Age),欧洲,美国,非洲}

fn main(){
    let coin = Coin::五分;
    let one =Coin::一元;
    match_branch_with_multiple_method(coin);
    match_branch_with_multiple_method(one);

    let civil = Civil::中国(Age::Year1970);
    let _ = Civil::欧洲;   //奇特的无意义的变量名称_,可以用，但是不建议。因为你无法直接传递,转赋也不方便，也不利于维护
    //let bad_=_;  //这样会报错
    //match_and_use_branch_value(_) //这样会报错
    let _欧洲 = Civil::欧洲;
    match_and_use_branch_value(civil);
    match_and_use_branch_value(_欧洲);
   
}

fn match_branch_with_multiple_method(coin:Coin){
    //演示如何匹配多值分支的方式:单个值、多个值、所有值
    match coin{
        Coin::一分(Age::Year1970) => println!("一分"),  //匹配分支特定值
        Coin::一分(_) => println!("一分"),   //匹配分支所有值
        Coin::一分(Age::OtherYear) |   Coin::一分(Age::Year1970)  => println!("一分"), //匹配分支多个值
        Coin::二分 => println!("二分"),
        Coin::五分 => println!("五分"),
        Coin::一角 => println!("一角"),
        Coin::五角 => println!("五角"),
        other => println!("一元 of other"),
        _=> println!("一元") 
    };
}

fn  match_and_use_branch_value(civil:Civil){
    //这种方式，可以利用类似匹配元组元素的方式，直接捕获分支值，并使用
    match civil {
        Civil::中国(age) => println!("有小聪明的中国:{:?},偶尔有一些亮色能拯救他们",age),  //自动从civil中捕获age值
        Civil::欧洲 => println!("肮胀但又聪明的欧洲"),
        _ => println!("{:?}",civil)   //如果把这个匹配去掉，那么会引发编译错误: patterns `Civil::美国` and `Civil::非洲` not covered
    };
}